home *** CD-ROM | disk | FTP | other *** search
/ Macworld Expo - Develope…Central & Net Innovations / Developer Central and Net Innovators (MacWorld Expo) (January 1999).iso / Developer Central / Bowers Development / Demo AppMaker / Examples / C⁄C++ OS8 / Everything / MainMenu.cp < prev    next >
Encoding:
Text File  |  1998-09-06  |  5.9 KB  |  294 lines  |  [TEXT/CWIE]

  1. /* MainMenu.cp */
  2.  
  3. #include <Types.h>
  4. #include <Quickdraw.h>
  5. #include <Controls.h>
  6. #include <Dialogs.h>
  7. #include <Events.h>
  8. #include <Lists.h>
  9. #include <LowMem.h>
  10. #include <Menus.h>
  11. #include <TextEdit.h>
  12. #include <ToolUtils.h>
  13.  
  14. #include "Globals.h"
  15. #include "ResourceDefs.h"
  16. #include "Miscellany.h"
  17. #include "AMApp.h"
  18. #include "AMDoc.h"
  19. #include "AMEngine.h"
  20. #include "AMWindow.h"
  21. #include "MainMenu.h"
  22.  
  23.  
  24. /*----------*/
  25. static long        GetCommandFromMenu (long        menuChoice);
  26. static void        DoApple            (short            itemNr);
  27. static void        Enable            (short            itemNr,
  28.                                  Boolean        enabled);
  29. static void        EnableTitle        (MenuHandle        menu,
  30.                                  Boolean        enabled);
  31.  
  32. /*----------*/
  33. void    InitTitles (void)
  34. {
  35. } /*InitTitles*/
  36.  
  37. /*----------*/
  38. void    LoadMenus (void)
  39. {
  40.     AppleMenu    = GetMenu (MENU_Apple);
  41.     FailNilResource ((Handle)AppleMenu);
  42.     AppendResMenu (AppleMenu, 'DRVR');
  43.     FileMenu    = GetMenu (MENU_File);
  44.     EditMenu    = GetMenu (MENU_Edit);
  45.     PopupMenu    = GetMenu (MENU_Popup);
  46.     ModalMenu    = GetMenu (MENU_Modal);
  47.     ModelessMenu    = GetMenu (MENU_Modeless);
  48.     BevelMenu    = GetMenu (MENU_Bevel);
  49.  
  50.     InsertMenu (AppleMenu, 0);
  51.     InsertMenu (FileMenu, 0);
  52.     InsertMenu (EditMenu, 0);
  53.     InsertMenu (ModalMenu, 0);
  54.     InsertMenu (ModelessMenu, 0);
  55.  
  56.     DrawMenuBar ();
  57. } /*LoadMenus*/
  58.  
  59. //----------
  60. long    GetCommandFromMenu (
  61.     long        menuChoice)
  62. {
  63.     long        commandID = 0;
  64.  
  65.     switch (menuChoice) {
  66.         case cAppleAbout:
  67.                 commandID = cmdInvokeAbout;
  68.             break;
  69.         case cFileNew:
  70.                 commandID = cmdNew;
  71.             break;
  72.         case cFileOpen:
  73.                 commandID = cmdOpen;
  74.             break;
  75.         case cFileClose:
  76.                 commandID = cmdClose;
  77.             break;
  78.         case cFileSave:
  79.                 commandID = cmdSave;
  80.             break;
  81.         case cFileSaveAs:
  82.                 commandID = cmdSaveAs;
  83.             break;
  84.         case cFileRevert:
  85.                 commandID = cmdRevert;
  86.             break;
  87.         case cFilePageSetup:
  88.                 commandID = cmdPageSetup;
  89.             break;
  90.         case cFilePrint:
  91.                 commandID = cmdPrint;
  92.             break;
  93.         case cFileQuit:
  94.                 commandID = cmdQuit;
  95.             break;
  96.         case cEditUndo:
  97.                 commandID = cmdUndo;
  98.             break;
  99.         case cEditCut:
  100.                 commandID = cmdCut;
  101.             break;
  102.         case cEditCopy:
  103.                 commandID = cmdCopy;
  104.             break;
  105.         case cEditPaste:
  106.                 commandID = cmdPaste;
  107.             break;
  108.         case cEditClear:
  109.                 commandID = cmdClear;
  110.             break;
  111.         case cEditSelectAll:
  112.                 commandID = cmdSelectAll;
  113.             break;
  114.         case cEditShowClipboard:
  115.                 commandID = cmdShowClipboard;
  116.             break;
  117.         case cModalButtons:
  118.                 commandID = cmdModalButtons;
  119.             break;
  120.         case cModalCheckboxes:
  121.                 commandID = cmdModalCheckboxes;
  122.             break;
  123.         case cModalRadios:
  124.                 commandID = cmdModalRadios;
  125.             break;
  126.         case cModalText:
  127.                 commandID = cmdModalText;
  128.             break;
  129.         case cModalStuff:
  130.                 commandID = cmdModalStuff;
  131.             break;
  132.         case cModalMoreStuff:
  133.                 commandID = cmdModalMoreStuff;
  134.             break;
  135.         case cModelessButtons:
  136.                 commandID = cmdModelessButtons;
  137.             break;
  138.         case cModelessCheckboxes:
  139.                 commandID = cmdModelessCheckboxes;
  140.             break;
  141.         case cModelessRadios:
  142.                 commandID = cmdModelessRadios;
  143.             break;
  144.         case cModelessText:
  145.                 commandID = cmdModelessText;
  146.             break;
  147.         case cModelessStuff:
  148.                 commandID = cmdModelessStuff;
  149.             break;
  150.         case cModelessMoreStuff:
  151.                 commandID = cmdModelessMoreStuff;
  152.             break;
  153.  
  154.         default:
  155.                 commandID = -menuChoice;
  156.     }
  157.  
  158.     return commandID;
  159. }
  160.  
  161. //----------
  162. void    DoApple (
  163.     short        itemNr)
  164. {
  165.     Str255            name;
  166.     short            refNum;
  167.  
  168.     GetMenuItemText (AppleMenu, itemNr, name);
  169.     refNum = OpenDeskAcc (name);
  170. }
  171.  
  172. /*----------*/
  173. void    DoMenu (
  174.     long        menuChoice)
  175. {
  176.     long            commandID;
  177.     AMDoc*            curDoc;
  178.     short            menuID;
  179.     short            itemNr;
  180.  
  181.     commandID = GetCommandFromMenu (menuChoice);
  182.     curDoc = cur->mDoc;
  183.     if (cur->DoCommand (commandID)) {
  184.         // cur window handled it
  185.     } else if ((curDoc != nil)
  186.     && (curDoc->DoCommand (commandID))) {
  187.         // document handled it
  188.     } else if (gApplication->DoCommand (commandID)) {
  189.         // application handled it
  190.     } else {
  191.         menuID = HiWord (menuChoice);
  192.         itemNr = LoWord (menuChoice);
  193.         if (menuID == MENU_Apple) {
  194.             DoApple (itemNr);
  195.         }
  196.     }
  197.  
  198.     HiliteMenu (0);
  199. } /*DoMenu*/
  200.  
  201. /*----------*/
  202. MenuHandle        menu;
  203. Boolean            menuBarChanged;
  204.  
  205. /*----------*/
  206. static void Enable    (short        itemNr,
  207.                      Boolean    enabled)
  208. {
  209.     if (enabled) {
  210.         EnableItem  (menu, itemNr);
  211.     } else {
  212.         DisableItem (menu, itemNr);
  213.     }
  214. } /*Enable*/
  215.  
  216. /*----------*/
  217. static void EnableTitle    (MenuHandle        menu,
  218.                          Boolean        enabled)
  219. {
  220.     if (enabled != ((**menu).enableFlags & 1)) {
  221.         menuBarChanged = true;
  222.     }
  223.     if (enabled) {
  224.         EnableItem  (menu, 0);
  225.     } else {
  226.         DisableItem (menu, 0);
  227.     }
  228. } /*EnableTitle*/
  229.  
  230. /*----------*/
  231. void    UpdateMenus (void)
  232. {
  233.     WindowPeek        frontPeek;
  234.     Boolean            isFront;        /*is there a front window?*/
  235.     Boolean            isCur;            /*is there a current window?*/
  236.     Boolean            isCurDoc;        /*is there a current document?*/
  237.     Boolean            isDirty;        /*is it dirty?*/
  238.     Boolean            hasFile;        /*does it have a file?*/
  239.     Boolean            isSelected;        /*is anything selected?*/
  240.     Boolean            isDesk;            /*is the front window a desk acc?*/
  241.     Boolean            isText;            /*is there a current text field?*/
  242.     Boolean            isScrap;        /*is there any scrap?*/
  243.     menuBarChanged = false;
  244.  
  245.     isFront        = (FrontWindow () != nil);
  246.     isCur        = (curWindow != nil);
  247.     isDirty        = false;
  248.     hasFile        = false;
  249.     isSelected    = false;
  250.     isCurDoc    = (cur->mDoc != nil);
  251.     if (isCurDoc) {
  252.         isDirty        = cur->mDoc->mEngine->IsDirty ();
  253.         hasFile        = cur->mDoc->mEngine->HasFile ();
  254.     }
  255.  
  256.     isDesk = false;
  257.     if (isFront) {
  258.         frontPeek    = (WindowPeek) FrontWindow ();
  259.         isDesk        = (frontPeek->windowKind < 0);
  260.     }
  261.  
  262.     TEHandle    curTE = cur->GetCurTE ();
  263.  
  264.     isText        = (curTE != nil);
  265.     isScrap        = false;
  266.     if (isText) {
  267.         isSelected    = ((**curTE).selStart != (**curTE).selEnd);
  268.         isScrap        = (TEGetScrapLength () > 0);
  269.     }
  270.  
  271.     menu = FileMenu;
  272.     Enable (cFileClose,        isFront);
  273.     Enable (cFileSave,        isDirty);
  274.     Enable (cFileSaveAs,    isCur);
  275.     Enable (cFileRevert,    isDirty);
  276.  
  277.     menu = EditMenu;
  278.     if (isFront) {
  279.         Enable (cEditUndo,        isDesk);
  280.         Enable (cEditCut,        isDesk || isSelected);
  281.         Enable (cEditCopy,        isDesk || isSelected);
  282.         Enable (cEditPaste,        isDesk || isScrap);
  283.         Enable (cEditClear,        isDesk || isSelected);
  284.         Enable (cEditSelectAll,    isText);
  285.  
  286.     }
  287.     EnableTitle (EditMenu,     isFront);
  288.  
  289.  
  290.     if (menuBarChanged) {
  291.         DrawMenuBar ();
  292.     }
  293. } /*UpdateMenus*/
  294.